#include <iostream>
#include <type_traits>

// 通用包装函数示例
/**
 * 尾置返回类型 
 * auto - 占位符，表示使用尾置返回类型
 * wrapper(Func&& f, Args&&... args) - 函数参数列表
 * -> decltype(...) - 尾置返回类型语法，指定函数返回类型
 * decltype(f(std::forward<Args>(args)...)) - 推导表达式的类型
 * 
 * 
 * */
template<typename Func, typename... Args>
auto wrapper(Func&& f, Args&&... args) -> decltype(f(std::forward<Args>(args)...))
{
    return f(std::forward<Args>(args)...);  // 完美转发参数
}

std::string concat(const std::string& a, const std::string& b){
    return a + b;
}

int main()
{
    // 自动推导返回类型为int
    auto result = wrapper([](int a, int b) { return a + b; }, 1, 2);
    std::cout << result << std::endl;

    std::string a = "hello";
    std::string b = "world";
    // 自动推导返回类型为std::string
    auto result2 = wrapper(concat, a, b);
    return 0;
}   